
package controladoras.apresentacao.modelos;

import javax.swing.table.AbstractTableModel;
import entidades.Cidade;
import telas.TelaGerenciaCidade;
import javax.swing.JOptionPane;
import java.util.ArrayList;
import controladoras.apresentacao.CntrIntCidade;

/**
 * Classe modela a tabela cidade.
 * @author thiagostuckert
 */
public class ModeloTabelaCidade extends AbstractTableModel {
    /**
     * Referencia para a classe ModeloTabelaCidade.
     */
    private static ModeloTabelaCidade ref;
    /**
     * Recupera a referencia para a classe caso ela exista caso contrário
     * cria um objeto.
     * @return Objeto para a classe.
     */
    public static ModeloTabelaCidade instanciar() {
        if (ref == null) {
            ref = new ModeloTabelaCidade();
        }
        return ref;
    }
    /**
     * Nome das colunas da tabela.
     */
    private String[] columnNames = {"Nome da Cidade"};
    /**
     * Linhas da tabela.
     */
    private ArrayList<Cidade> rows = new ArrayList();
    /**
     * Seta as linhas da tabela.
     * @param linhas Novo valor para as linhas.
     */
    public final void setRows(final ArrayList linhas) {
        rows = linhas;
    }
    /**
     * Recupera a quantidade de colunas da tabela.
     * @return Quantidade de colunas da tabela.
     */
    @Override
    public final int getColumnCount() {
        return columnNames.length;
    }
    /**
     * Recupera a quantidade de linhas da tabela.
     * @return Quantidade de linhas da tabela.
     */
    @Override
    public final int getRowCount() {
        return rows.size();
    }
    /**
     * Recupera o nome da coluna col.
     * @param col indice da coluna.
     * @return Nome da coluna.
     */
    @Override
    public final String getColumnName(final int col) {
        return columnNames[col];
    }
    /**
     *  Recupera o valor da linha rowIndes e coluna columnIndex.
     * @param rowIndex Indice da linha.
     * @param columnIndex Indice da coluna.
     * @return objeto da da tabela[rowIndex][columnIndex].
     */
    @Override
    public final Object getValueAt(final int rowIndex, final int columnIndex) {
        return rows.get(rowIndex).getNomeCidade();
    }

     /**
      * Determina quais celulas serão editáveis.
      * @param row linha da tabela.
      * @param col coluna da tabela.
      * @return boolean true se for editável ou false caso contrário.
      */
    @Override
     public final boolean isCellEditable(final int row, final int col) {
        return true;
     }
     /**
      * Adiciona uma cidade na tabela.
      * @param cidade Objeto a ser adicionado na tabela.
      */
     public final void addRow(final Cidade cidade) {
         rows.add(cidade);
         int linha = rows.size() - 1;
         fireTableRowsInserted(linha, linha);
         return;
     }
    /**
     * Deleta uma linha da tabela.
     * @param row linha a ser deletada da tabela.
     */
    public final void delRow(final int row) {
        rows.remove(row);
        fireTableRowsDeleted(row, row);
    }
    /**
     * Seta o valor da tabela[row][col].
     * @param value valor novo da célula.
     * @param row linha da tabela.
     * @param col coluna da tabela.
     */
    @Override
    public final void setValueAt(final Object value, final int row,
            final int col) {
        Cidade cidadeNova = rows.get(row);
        Cidade cidadeVelha = new Cidade(cidadeNova.getNomeCidade());
        try {
           cidadeNova.setNomeCidade((String) value);
           CntrIntCidade cntrIntCidade = CntrIntCidade.instanciar();
           cntrIntCidade.upCidade(cidadeVelha, cidadeNova);
         } catch (Exception e) {
             TelaGerenciaCidade telaGerenciaCidade =
                     TelaGerenciaCidade.instanciar();
             JOptionPane.showMessageDialog(telaGerenciaCidade,
                     e.getMessage());

             /*Recupera a linha anterior*/
             rows.set(row, cidadeVelha);
         }
         fireTableCellUpdated(row, col);
     }
 }